#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
CS2启动器打包脚本
使用PyInstaller将项目打包成exe文件
"""

import os
import sys
import subprocess
import shutil
import toml
from PIL import Image

def load_version():
    """从config.toml读取版本号"""
    try:
        with open('config.toml', 'r', encoding='utf-8') as f:
            config = toml.load(f)
            return config.get('app', {}).get('version', '20250725a2')
    except Exception as e:
        print(f"⚠️ 读取版本号失败: {e}，使用默认版本号")
        return '20250725a2'

def build_exe():
    """打包exe文件"""
    print("🚀 开始打包CS2启动器...")
    
    # 读取版本号
    version = load_version()
    print(f"📋 当前版本: {version}")
    
    # 确保在正确的目录
    script_dir = os.path.dirname(os.path.abspath(__file__))
    os.chdir(script_dir)
    
    # 清理之前的构建文件
    if os.path.exists("build"):
        print("🧹 清理build目录...")
        try:
            shutil.rmtree("build")
        except PermissionError:
            print("⚠️ build目录清理失败，可能有文件正在使用中")
    
    if os.path.exists("dist"):
        print("🧹 清理dist目录...")
        try:
            shutil.rmtree("dist")
        except PermissionError:
            print("⚠️ dist目录清理失败，可能有exe文件正在运行中")
            print("💡 请关闭正在运行的应用程序后重试")
    
    # --- 图标转换 ---
    icon_png = 'logo.png'
    icon_ico = 'logo.ico'
    if os.path.exists(icon_png):
        print(f"🖼️ 正在将 {icon_png} 转换为 {icon_ico}...")
        try:
            img = Image.open(icon_png)
            img.save(icon_ico, format='ICO', sizes=[(256, 256)])
            print(f"✅ 图标转换成功: {icon_ico}")
        except Exception as e:
            print(f"❌ 图标转换失败: {e}")
            icon_ico = None # 转换失败则不使用图标
    else:
        print(f"⚠️ 未找到 {icon_png}，将不设置图标。")
        icon_ico = None

    # --- PyInstaller命令参数 ---
    exe_name = f"哈e_CS2启动器_v{version}"
    cmd = [
        "pyinstaller",
        "--onefile",
        "--windowed",
        f"--name={exe_name}",
        "--add-data=assets;assets",
        "--add-data=config.json;.",     # 包含配置文件
        "--add-data=config.toml;.",     # 包含版本配置文件
        "--hidden-import=PyQt5.QtCore",
        "--hidden-import=PyQt5.QtGui", 
        "--hidden-import=PyQt5.QtWidgets",
        "--hidden-import=config_manager",
        "cs2_launcher.py"               # 主程序文件
    ]
    
    # 如果图标转换成功，添加图标参数
    if icon_ico:
        cmd.insert(4, f"--icon={icon_ico}")  # 在name参数后插入图标参数
    
    try:
        print("📦 执行打包命令...")
        print(f"命令: {' '.join(cmd)}")
        
        result = subprocess.run(cmd, check=True, capture_output=True, text=True)
        
        print("✅ 打包成功！")
        print(f"📁 exe文件位置: {os.path.join(script_dir, 'dist', f'{exe_name}.exe')}")
        
        # 复制必要文件到dist目录
        dist_dir = os.path.join(script_dir, "dist")
        if os.path.exists("config.json"):
            shutil.copy2("config.json", dist_dir)
            print("📋 已复制config.json到dist目录")
            
        if os.path.exists("config.toml"):
            shutil.copy2("config.toml", dist_dir)
            print("📋 已复制config.toml到dist目录")
            
        if os.path.exists("logo.png"):
            shutil.copy2("logo.png", dist_dir)
            print("🖼️ 已复制logo.png到dist目录")
            
        if os.path.exists("assets"):
            if os.path.exists(os.path.join(dist_dir, "assets")):
                shutil.rmtree(os.path.join(dist_dir, "assets"))
            shutil.copytree("assets", os.path.join(dist_dir, "assets"))
            print("📁 已复制assets目录到dist目录")
        
        print("\n🎉 打包完成！可以在dist目录找到exe文件")
        
    except subprocess.CalledProcessError as e:
        print(f"❌ 打包失败: {e}")
        print(f"错误输出: {e.stderr}")
        return False
    
    except Exception as e:
        print(f"❌ 发生错误: {e}")
        return False
    
    return True

if __name__ == "__main__":
    success = build_exe()
    if success:
        input("\n按Enter键退出...")
    else:
        input("\n打包失败，按Enter键退出...")